package br.com.divulgaqui.managedbean;

import java.io.Serializable;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
/**
 * Classe base para os managends beans
 * @author everaldo
 *
 */
public class BaseBean implements Serializable {	
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * Mensagem de tela
	 * @param serverity - (ERROR, FATAL, WARN, INFO)
	 * @param titulo - Titulo da mensagem
	 * @param msg - Detalhes da mensagem
	 */
	protected void addMensagem(Severity serverity,String titulo,String msg){
		FacesContext.getCurrentInstance()
		.addMessage(null, new FacesMessage(serverity,titulo,msg));
	}
	/**
	 * Mensagem de tela direcionando ao componente
	 * @param id - Id do componente
	 * @param serverity - (ERROR, FATAL, WARN, INFO)
	 * @param titulo - Titulo da mensagem
	 * @param msg - Detalhes da mensagem
	 */
	protected void addMensagem(String id, Severity serverity,String titulo,String msg){
		//TODO: verificar forma de direcionar a mensagem para o componente
		FacesContext.getCurrentInstance().addMessage(findComponent(id).getClientId(), new FacesMessage(serverity, titulo, msg));
	}
	
	/**
	 * Método para retornar arquivo "messages.propeties" dado o {@link Locale} do {@link FacesContext} da view atual. 
	 * @return {@link ResourceBundle}
	 */
	protected ResourceBundle getResourceBundle(){
		return ResourceBundle.getBundle("br.com.divulgaqui.msgs.Messages", FacesContext.getCurrentInstance().getViewRoot().getLocale());
	}
	
	/**
	 * Procura componente na tela JSF passando o seu ID
	 * @param id
	 * @return {@link UIComponent} do ID dado.
	 */
	protected UIComponent findComponent(String id) {

		UIComponent result = null;
		UIComponent root = FacesContext.getCurrentInstance().getViewRoot();
		if (root != null) {
			result = findComponent(root, id);
		}
		return result;

	}

	private UIComponent findComponent(UIComponent root, String id) {

		UIComponent result = null;
		if (root.getId().equals(id))
			return root;

		for (UIComponent child : root.getChildren()) {
			if (child.getId().equals(id)) {
				result = child;
				break;
			}
			result = findComponent(child, id);
			if (result != null)
				break;
		}
		return result;
	}
}
